//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2021 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto/tree/main/CodeGenerator. DO NOT EDIT.

import Foundation
import SotoCore

extension MWAA {
    // MARK: Enums

    public enum EnvironmentStatus: String, CustomStringConvertible, Codable {
        case available = "AVAILABLE"
        case createFailed = "CREATE_FAILED"
        case creating = "CREATING"
        case deleted = "DELETED"
        case deleting = "DELETING"
        case updating = "UPDATING"
        public var description: String { return self.rawValue }
    }

    public enum LoggingLevel: String, CustomStringConvertible, Codable {
        case critical = "CRITICAL"
        case debug = "DEBUG"
        case error = "ERROR"
        case info = "INFO"
        case warning = "WARNING"
        public var description: String { return self.rawValue }
    }

    public enum Unit: String, CustomStringConvertible, Codable {
        case bits = "Bits"
        case bitsSecond = "Bits/Second"
        case bytes = "Bytes"
        case bytesSecond = "Bytes/Second"
        case count = "Count"
        case countSecond = "Count/Second"
        case gigabits = "Gigabits"
        case gigabitsSecond = "Gigabits/Second"
        case gigabytes = "Gigabytes"
        case gigabytesSecond = "Gigabytes/Second"
        case kilobits = "Kilobits"
        case kilobitsSecond = "Kilobits/Second"
        case kilobytes = "Kilobytes"
        case kilobytesSecond = "Kilobytes/Second"
        case megabits = "Megabits"
        case megabitsSecond = "Megabits/Second"
        case megabytes = "Megabytes"
        case megabytesSecond = "Megabytes/Second"
        case microseconds = "Microseconds"
        case milliseconds = "Milliseconds"
        case none = "None"
        case percent = "Percent"
        case seconds = "Seconds"
        case terabits = "Terabits"
        case terabitsSecond = "Terabits/Second"
        case terabytes = "Terabytes"
        case terabytesSecond = "Terabytes/Second"
        public var description: String { return self.rawValue }
    }

    public enum UpdateStatus: String, CustomStringConvertible, Codable {
        case failed = "FAILED"
        case pending = "PENDING"
        case success = "SUCCESS"
        public var description: String { return self.rawValue }
    }

    public enum WebserverAccessMode: String, CustomStringConvertible, Codable {
        case privateOnly = "PRIVATE_ONLY"
        case publicOnly = "PUBLIC_ONLY"
        public var description: String { return self.rawValue }
    }

    // MARK: Shapes

    public struct CreateCliTokenRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "name", location: .uri(locationName: "Name"))
        ]

        /// Create a CLI token request for a MWAA environment.
        public let name: String

        public init(name: String) {
            self.name = name
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, max: 80)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z][0-9a-zA-Z-_]*$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct CreateCliTokenResponse: AWSDecodableShape {
        /// Create an Airflow CLI login token response for the provided JWT token.
        public let cliToken: String?
        /// Create an Airflow CLI login token response for the provided webserver hostname.
        public let webServerHostname: String?

        public init(cliToken: String? = nil, webServerHostname: String? = nil) {
            self.cliToken = cliToken
            self.webServerHostname = webServerHostname
        }

        private enum CodingKeys: String, CodingKey {
            case cliToken = "CliToken"
            case webServerHostname = "WebServerHostname"
        }
    }

    public struct CreateEnvironmentInput: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "name", location: .uri(locationName: "Name"))
        ]

        /// The Apache Airflow configuration setting you want to override in your environment. For more information, see Environment configuration.
        public let airflowConfigurationOptions: [String: String]?
        /// The Apache Airflow version you want to use for your environment.
        public let airflowVersion: String?
        /// The relative path to the DAG folder on your Amazon S3 storage bucket. For example, dags. For more information, see Importing DAGs on Amazon MWAA.
        public let dagS3Path: String
        /// The environment class you want to use for your environment. The environment class determines the size of the containers and database used for your Apache Airflow services.
        public let environmentClass: String?
        /// The Amazon Resource Name (ARN) of the execution role for your environment. An execution role is an AWS Identity and Access Management (IAM) role that grants MWAA permission to access AWS services and resources used by your environment. For example, arn:aws:iam::123456789:role/my-execution-role. For more information, see Managing access to Amazon Managed Workflows for Apache Airflow.
        public let executionRoleArn: String
        /// The AWS Key Management Service (KMS) key to encrypt and decrypt the data in your environment. You can use an AWS KMS key managed by MWAA, or a custom KMS key (advanced). For more information, see Customer master keys (CMKs) in the AWS KMS developer guide.
        public let kmsKey: String?
        /// The Apache Airflow logs you want to send to Amazon CloudWatch Logs.
        public let loggingConfiguration: LoggingConfigurationInput?
        /// The maximum number of workers that you want to run in your environment. MWAA scales the number of Apache Airflow workers and the Fargate containers that run your tasks up to the number you specify in this field. When there are no more tasks running, and no more in the queue, MWAA disposes of the extra containers leaving the one worker that is included with your environment.
        public let maxWorkers: Int?
        /// The name of your MWAA environment.
        public let name: String
        /// The VPC networking components you want to use for your environment. At least two private subnet identifiers and one VPC security group identifier are required to create an environment. For more information, see Creating the VPC network for a MWAA environment.
        public let networkConfiguration: NetworkConfiguration
        /// The plugins.zip file version you want to use.
        public let pluginsS3ObjectVersion: String?
        /// The relative path to the plugins.zip file on your Amazon S3 storage bucket. For example, plugins.zip. If a relative path is provided in the request, then PluginsS3ObjectVersion is required. For more information, see Importing DAGs on Amazon MWAA.
        public let pluginsS3Path: String?
        /// The requirements.txt file version you want to use.
        public let requirementsS3ObjectVersion: String?
        /// The relative path to the requirements.txt file on your Amazon S3 storage bucket. For example, requirements.txt. If a relative path is provided in the request, then RequirementsS3ObjectVersion is required. For more information, see Importing DAGs on Amazon MWAA.
        public let requirementsS3Path: String?
        /// The Amazon Resource Name (ARN) of your Amazon S3 storage bucket. For example, arn:aws:s3:::airflow-mybucketname.
        public let sourceBucketArn: String
        /// The metadata tags you want to attach to your environment. For more information, see Tagging AWS resources.
        public let tags: [String: String]?
        /// The networking access of your Apache Airflow web server. A public network allows your Airflow UI to be accessed over the Internet by users granted access in your IAM policy. A private network limits access of your Airflow UI to users within your VPC. For more information, see Creating the VPC network for a MWAA environment.
        public let webserverAccessMode: WebserverAccessMode?
        /// The day and time you want MWAA to start weekly maintenance updates on your environment.
        public let weeklyMaintenanceWindowStart: String?

        public init(airflowConfigurationOptions: [String: String]? = nil, airflowVersion: String? = nil, dagS3Path: String, environmentClass: String? = nil, executionRoleArn: String, kmsKey: String? = nil, loggingConfiguration: LoggingConfigurationInput? = nil, maxWorkers: Int? = nil, name: String, networkConfiguration: NetworkConfiguration, pluginsS3ObjectVersion: String? = nil, pluginsS3Path: String? = nil, requirementsS3ObjectVersion: String? = nil, requirementsS3Path: String? = nil, sourceBucketArn: String, tags: [String: String]? = nil, webserverAccessMode: WebserverAccessMode? = nil, weeklyMaintenanceWindowStart: String? = nil) {
            self.airflowConfigurationOptions = airflowConfigurationOptions
            self.airflowVersion = airflowVersion
            self.dagS3Path = dagS3Path
            self.environmentClass = environmentClass
            self.executionRoleArn = executionRoleArn
            self.kmsKey = kmsKey
            self.loggingConfiguration = loggingConfiguration
            self.maxWorkers = maxWorkers
            self.name = name
            self.networkConfiguration = networkConfiguration
            self.pluginsS3ObjectVersion = pluginsS3ObjectVersion
            self.pluginsS3Path = pluginsS3Path
            self.requirementsS3ObjectVersion = requirementsS3ObjectVersion
            self.requirementsS3Path = requirementsS3Path
            self.sourceBucketArn = sourceBucketArn
            self.tags = tags
            self.webserverAccessMode = webserverAccessMode
            self.weeklyMaintenanceWindowStart = weeklyMaintenanceWindowStart
        }

        public func validate(name: String) throws {
            try self.airflowConfigurationOptions?.forEach {
                try validate($0.key, name: "airflowConfigurationOptions.key", parent: name, max: 64)
                try validate($0.key, name: "airflowConfigurationOptions.key", parent: name, min: 1)
                try validate($0.key, name: "airflowConfigurationOptions.key", parent: name, pattern: "^[a-z]+([a-z._]*[a-z]+)?$")
                try validate($0.value, name: "airflowConfigurationOptions[\"\($0.key)\"]", parent: name, max: 256)
                try validate($0.value, name: "airflowConfigurationOptions[\"\($0.key)\"]", parent: name, min: 1)
                try validate($0.value, name: "airflowConfigurationOptions[\"\($0.key)\"]", parent: name, pattern: ".*")
            }
            try self.validate(self.airflowVersion, name: "airflowVersion", parent: name, max: 32)
            try self.validate(self.airflowVersion, name: "airflowVersion", parent: name, min: 1)
            try self.validate(self.airflowVersion, name: "airflowVersion", parent: name, pattern: "^[0-9a-z.]+$")
            try self.validate(self.dagS3Path, name: "dagS3Path", parent: name, max: 1024)
            try self.validate(self.dagS3Path, name: "dagS3Path", parent: name, min: 1)
            try self.validate(self.dagS3Path, name: "dagS3Path", parent: name, pattern: ".*")
            try self.validate(self.environmentClass, name: "environmentClass", parent: name, max: 1024)
            try self.validate(self.environmentClass, name: "environmentClass", parent: name, min: 1)
            try self.validate(self.executionRoleArn, name: "executionRoleArn", parent: name, max: 1224)
            try self.validate(self.executionRoleArn, name: "executionRoleArn", parent: name, min: 1)
            try self.validate(self.executionRoleArn, name: "executionRoleArn", parent: name, pattern: "^arn:aws(-[a-z]+)?:iam::\\d{12}:role/?[a-zA-Z_0-9+=,.@\\-_/]+$")
            try self.validate(self.kmsKey, name: "kmsKey", parent: name, max: 1224)
            try self.validate(self.kmsKey, name: "kmsKey", parent: name, min: 1)
            try self.validate(self.kmsKey, name: "kmsKey", parent: name, pattern: "^(((arn:aws(-[a-z]+)?:kms:[a-z]{2}-[a-z]+-\\d:\\d+:)?key\\/)?[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}|(arn:aws(-[a-z]+)?:kms:[a-z]{2}-[a-z]+-\\d:\\d+:)?alias/.+)$")
            try self.validate(self.maxWorkers, name: "maxWorkers", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, max: 80)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z][0-9a-zA-Z-_]*$")
            try self.networkConfiguration.validate(name: "\(name).networkConfiguration")
            try self.validate(self.pluginsS3ObjectVersion, name: "pluginsS3ObjectVersion", parent: name, max: 1024)
            try self.validate(self.pluginsS3ObjectVersion, name: "pluginsS3ObjectVersion", parent: name, min: 1)
            try self.validate(self.pluginsS3Path, name: "pluginsS3Path", parent: name, max: 1024)
            try self.validate(self.pluginsS3Path, name: "pluginsS3Path", parent: name, min: 1)
            try self.validate(self.pluginsS3Path, name: "pluginsS3Path", parent: name, pattern: ".*")
            try self.validate(self.requirementsS3ObjectVersion, name: "requirementsS3ObjectVersion", parent: name, max: 1024)
            try self.validate(self.requirementsS3ObjectVersion, name: "requirementsS3ObjectVersion", parent: name, min: 1)
            try self.validate(self.requirementsS3Path, name: "requirementsS3Path", parent: name, max: 1024)
            try self.validate(self.requirementsS3Path, name: "requirementsS3Path", parent: name, min: 1)
            try self.validate(self.requirementsS3Path, name: "requirementsS3Path", parent: name, pattern: ".*")
            try self.validate(self.sourceBucketArn, name: "sourceBucketArn", parent: name, max: 1224)
            try self.validate(self.sourceBucketArn, name: "sourceBucketArn", parent: name, min: 1)
            try self.validate(self.sourceBucketArn, name: "sourceBucketArn", parent: name, pattern: "^arn:aws(-[a-z]+)?:s3:::airflow-[a-z0-9.\\-]+$")
            try self.tags?.forEach {
                try validate($0.key, name: "tags.key", parent: name, max: 128)
                try validate($0.key, name: "tags.key", parent: name, min: 1)
                try validate($0.key, name: "tags.key", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, max: 256)
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, min: 1)
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
            }
            try self.validate(self.weeklyMaintenanceWindowStart, name: "weeklyMaintenanceWindowStart", parent: name, max: 9)
            try self.validate(self.weeklyMaintenanceWindowStart, name: "weeklyMaintenanceWindowStart", parent: name, min: 1)
            try self.validate(self.weeklyMaintenanceWindowStart, name: "weeklyMaintenanceWindowStart", parent: name, pattern: "(MON|TUE|WED|THU|FRI|SAT|SUN):([01]\\d|2[0-3]):(00|30)")
        }

        private enum CodingKeys: String, CodingKey {
            case airflowConfigurationOptions = "AirflowConfigurationOptions"
            case airflowVersion = "AirflowVersion"
            case dagS3Path = "DagS3Path"
            case environmentClass = "EnvironmentClass"
            case executionRoleArn = "ExecutionRoleArn"
            case kmsKey = "KmsKey"
            case loggingConfiguration = "LoggingConfiguration"
            case maxWorkers = "MaxWorkers"
            case networkConfiguration = "NetworkConfiguration"
            case pluginsS3ObjectVersion = "PluginsS3ObjectVersion"
            case pluginsS3Path = "PluginsS3Path"
            case requirementsS3ObjectVersion = "RequirementsS3ObjectVersion"
            case requirementsS3Path = "RequirementsS3Path"
            case sourceBucketArn = "SourceBucketArn"
            case tags = "Tags"
            case webserverAccessMode = "WebserverAccessMode"
            case weeklyMaintenanceWindowStart = "WeeklyMaintenanceWindowStart"
        }
    }

    public struct CreateEnvironmentOutput: AWSDecodableShape {
        /// The resulting Amazon MWAA envirnonment ARN.
        public let arn: String?

        public init(arn: String? = nil) {
            self.arn = arn
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "Arn"
        }
    }

    public struct CreateWebLoginTokenRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "name", location: .uri(locationName: "Name"))
        ]

        /// Create an Airflow Web UI login token request for a MWAA environment.
        public let name: String

        public init(name: String) {
            self.name = name
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, max: 80)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z][0-9a-zA-Z-_]*$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct CreateWebLoginTokenResponse: AWSDecodableShape {
        /// Create an Airflow Web UI login token response for the provided webserver hostname.
        public let webServerHostname: String?
        /// Create an Airflow Web UI login token response for the provided JWT token.
        public let webToken: String?

        public init(webServerHostname: String? = nil, webToken: String? = nil) {
            self.webServerHostname = webServerHostname
            self.webToken = webToken
        }

        private enum CodingKeys: String, CodingKey {
            case webServerHostname = "WebServerHostname"
            case webToken = "WebToken"
        }
    }

    public struct DeleteEnvironmentInput: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "name", location: .uri(locationName: "Name"))
        ]

        /// The name of the environment to delete.
        public let name: String

        public init(name: String) {
            self.name = name
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, max: 80)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z][0-9a-zA-Z-_]*$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct DeleteEnvironmentOutput: AWSDecodableShape {
        public init() {}
    }

    public struct Dimension: AWSEncodableShape {
        /// Internal only API.
        public let name: String
        /// Internal only API.
        public let value: String

        public init(name: String, value: String) {
            self.name = name
            self.value = value
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
            case value = "Value"
        }
    }

    public struct Environment: AWSDecodableShape {
        /// The Airflow Configuration Options of the Amazon MWAA Environment.
        public let airflowConfigurationOptions: [String: String]?
        /// The AirflowV ersion of the Amazon MWAA Environment.
        public let airflowVersion: String?
        /// The ARN of the Amazon MWAA Environment.
        public let arn: String?
        /// The Created At date of the Amazon MWAA Environment.
        public let createdAt: Date?
        /// The Dags S3 Path of the Amazon MWAA Environment.
        public let dagS3Path: String?
        /// The Environment Class (size) of the Amazon MWAA Environment.
        public let environmentClass: String?
        /// The Execution Role ARN of the Amazon MWAA Environment.
        public let executionRoleArn: String?
        /// The Kms Key of the Amazon MWAA Environment.
        public let kmsKey: String?
        public let lastUpdate: LastUpdate?
        /// The Logging Configuration of the Amazon MWAA Environment.
        public let loggingConfiguration: LoggingConfiguration?
        /// The Maximum Workers of the Amazon MWAA Environment.
        public let maxWorkers: Int?
        /// The name of the Amazon MWAA Environment.
        public let name: String?
        public let networkConfiguration: NetworkConfiguration?
        /// The Plugins.zip S3 Object Version of the Amazon MWAA Environment.
        public let pluginsS3ObjectVersion: String?
        /// The Plugins.zip S3 Path of the Amazon MWAA Environment.
        public let pluginsS3Path: String?
        /// The Requirements.txt file S3 Object Version of the Amazon MWAA Environment.
        public let requirementsS3ObjectVersion: String?
        /// The Requirement.txt S3 Path of the Amazon MWAA Environment.
        public let requirementsS3Path: String?
        /// The Service Role ARN of the Amazon MWAA Environment.
        public let serviceRoleArn: String?
        /// The Source S3 Bucket ARN of the Amazon MWAA Environment.
        public let sourceBucketArn: String?
        /// The status of the Amazon MWAA Environment.
        public let status: EnvironmentStatus?
        /// The Tags of the Amazon MWAA Environment.
        public let tags: [String: String]?
        /// The Webserver Access Mode of the Amazon MWAA Environment (public or private only).
        public let webserverAccessMode: WebserverAccessMode?
        /// The Webserver URL of the Amazon MWAA Environment.
        public let webserverUrl: String?
        /// The Weekly Maintenance Window Start of the Amazon MWAA Environment.
        public let weeklyMaintenanceWindowStart: String?

        public init(airflowConfigurationOptions: [String: String]? = nil, airflowVersion: String? = nil, arn: String? = nil, createdAt: Date? = nil, dagS3Path: String? = nil, environmentClass: String? = nil, executionRoleArn: String? = nil, kmsKey: String? = nil, lastUpdate: LastUpdate? = nil, loggingConfiguration: LoggingConfiguration? = nil, maxWorkers: Int? = nil, name: String? = nil, networkConfiguration: NetworkConfiguration? = nil, pluginsS3ObjectVersion: String? = nil, pluginsS3Path: String? = nil, requirementsS3ObjectVersion: String? = nil, requirementsS3Path: String? = nil, serviceRoleArn: String? = nil, sourceBucketArn: String? = nil, status: EnvironmentStatus? = nil, tags: [String: String]? = nil, webserverAccessMode: WebserverAccessMode? = nil, webserverUrl: String? = nil, weeklyMaintenanceWindowStart: String? = nil) {
            self.airflowConfigurationOptions = airflowConfigurationOptions
            self.airflowVersion = airflowVersion
            self.arn = arn
            self.createdAt = createdAt
            self.dagS3Path = dagS3Path
            self.environmentClass = environmentClass
            self.executionRoleArn = executionRoleArn
            self.kmsKey = kmsKey
            self.lastUpdate = lastUpdate
            self.loggingConfiguration = loggingConfiguration
            self.maxWorkers = maxWorkers
            self.name = name
            self.networkConfiguration = networkConfiguration
            self.pluginsS3ObjectVersion = pluginsS3ObjectVersion
            self.pluginsS3Path = pluginsS3Path
            self.requirementsS3ObjectVersion = requirementsS3ObjectVersion
            self.requirementsS3Path = requirementsS3Path
            self.serviceRoleArn = serviceRoleArn
            self.sourceBucketArn = sourceBucketArn
            self.status = status
            self.tags = tags
            self.webserverAccessMode = webserverAccessMode
            self.webserverUrl = webserverUrl
            self.weeklyMaintenanceWindowStart = weeklyMaintenanceWindowStart
        }

        private enum CodingKeys: String, CodingKey {
            case airflowConfigurationOptions = "AirflowConfigurationOptions"
            case airflowVersion = "AirflowVersion"
            case arn = "Arn"
            case createdAt = "CreatedAt"
            case dagS3Path = "DagS3Path"
            case environmentClass = "EnvironmentClass"
            case executionRoleArn = "ExecutionRoleArn"
            case kmsKey = "KmsKey"
            case lastUpdate = "LastUpdate"
            case loggingConfiguration = "LoggingConfiguration"
            case maxWorkers = "MaxWorkers"
            case name = "Name"
            case networkConfiguration = "NetworkConfiguration"
            case pluginsS3ObjectVersion = "PluginsS3ObjectVersion"
            case pluginsS3Path = "PluginsS3Path"
            case requirementsS3ObjectVersion = "RequirementsS3ObjectVersion"
            case requirementsS3Path = "RequirementsS3Path"
            case serviceRoleArn = "ServiceRoleArn"
            case sourceBucketArn = "SourceBucketArn"
            case status = "Status"
            case tags = "Tags"
            case webserverAccessMode = "WebserverAccessMode"
            case webserverUrl = "WebserverUrl"
            case weeklyMaintenanceWindowStart = "WeeklyMaintenanceWindowStart"
        }
    }

    public struct GetEnvironmentInput: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "name", location: .uri(locationName: "Name"))
        ]

        /// The name of the environment to retrieve.
        public let name: String

        public init(name: String) {
            self.name = name
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, max: 80)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z][0-9a-zA-Z-_]*$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct GetEnvironmentOutput: AWSDecodableShape {
        /// A JSON blob with environment details.
        public let environment: Environment?

        public init(environment: Environment? = nil) {
            self.environment = environment
        }

        private enum CodingKeys: String, CodingKey {
            case environment = "Environment"
        }
    }

    public struct LastUpdate: AWSDecodableShape {
        /// Time that last update occurred.
        public let createdAt: Date?
        /// Error string of last update, if applicable.
        public let error: UpdateError?
        /// Status of last update of SUCCESS, FAILED, CREATING, DELETING.
        public let status: UpdateStatus?

        public init(createdAt: Date? = nil, error: UpdateError? = nil, status: UpdateStatus? = nil) {
            self.createdAt = createdAt
            self.error = error
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case createdAt = "CreatedAt"
            case error = "Error"
            case status = "Status"
        }
    }

    public struct ListEnvironmentsInput: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "maxResults", location: .querystring(locationName: "MaxResults")),
            AWSMemberEncoding(label: "nextToken", location: .querystring(locationName: "NextToken"))
        ]

        /// The maximum results when listing MWAA environments.
        public let maxResults: Int?
        /// The Next Token when listing MWAA environments.
        public let nextToken: String?

        public init(maxResults: Int? = nil, nextToken: String? = nil) {
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 25)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 2048)
            try self.validate(self.nextToken, name: "nextToken", parent: name, min: 0)
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListEnvironmentsOutput: AWSDecodableShape {
        /// The list of Amazon MWAA Environments.
        public let environments: [String]
        /// The Next Token when listing MWAA environments.
        public let nextToken: String?

        public init(environments: [String], nextToken: String? = nil) {
            self.environments = environments
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case environments = "Environments"
            case nextToken = "NextToken"
        }
    }

    public struct ListTagsForResourceInput: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "resourceArn", location: .uri(locationName: "ResourceArn"))
        ]

        /// The ARN of the MWAA environment.
        public let resourceArn: String

        public init(resourceArn: String) {
            self.resourceArn = resourceArn
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, max: 1224)
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, min: 1)
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, pattern: "^arn:aws(-[a-z]+)?:airflow:[a-z0-9\\-]+:\\d{12}:environment/\\w+")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListTagsForResourceOutput: AWSDecodableShape {
        /// The tags of the MWAA environments.
        public let tags: [String: String]?

        public init(tags: [String: String]? = nil) {
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case tags = "Tags"
        }
    }

    public struct LoggingConfiguration: AWSDecodableShape {
        public let dagProcessingLogs: ModuleLoggingConfiguration?
        public let schedulerLogs: ModuleLoggingConfiguration?
        public let taskLogs: ModuleLoggingConfiguration?
        public let webserverLogs: ModuleLoggingConfiguration?
        public let workerLogs: ModuleLoggingConfiguration?

        public init(dagProcessingLogs: ModuleLoggingConfiguration? = nil, schedulerLogs: ModuleLoggingConfiguration? = nil, taskLogs: ModuleLoggingConfiguration? = nil, webserverLogs: ModuleLoggingConfiguration? = nil, workerLogs: ModuleLoggingConfiguration? = nil) {
            self.dagProcessingLogs = dagProcessingLogs
            self.schedulerLogs = schedulerLogs
            self.taskLogs = taskLogs
            self.webserverLogs = webserverLogs
            self.workerLogs = workerLogs
        }

        private enum CodingKeys: String, CodingKey {
            case dagProcessingLogs = "DagProcessingLogs"
            case schedulerLogs = "SchedulerLogs"
            case taskLogs = "TaskLogs"
            case webserverLogs = "WebserverLogs"
            case workerLogs = "WorkerLogs"
        }
    }

    public struct LoggingConfigurationInput: AWSEncodableShape {
        public let dagProcessingLogs: ModuleLoggingConfigurationInput?
        public let schedulerLogs: ModuleLoggingConfigurationInput?
        public let taskLogs: ModuleLoggingConfigurationInput?
        public let webserverLogs: ModuleLoggingConfigurationInput?
        public let workerLogs: ModuleLoggingConfigurationInput?

        public init(dagProcessingLogs: ModuleLoggingConfigurationInput? = nil, schedulerLogs: ModuleLoggingConfigurationInput? = nil, taskLogs: ModuleLoggingConfigurationInput? = nil, webserverLogs: ModuleLoggingConfigurationInput? = nil, workerLogs: ModuleLoggingConfigurationInput? = nil) {
            self.dagProcessingLogs = dagProcessingLogs
            self.schedulerLogs = schedulerLogs
            self.taskLogs = taskLogs
            self.webserverLogs = webserverLogs
            self.workerLogs = workerLogs
        }

        private enum CodingKeys: String, CodingKey {
            case dagProcessingLogs = "DagProcessingLogs"
            case schedulerLogs = "SchedulerLogs"
            case taskLogs = "TaskLogs"
            case webserverLogs = "WebserverLogs"
            case workerLogs = "WorkerLogs"
        }
    }

    public struct MetricDatum: AWSEncodableShape {
        /// Internal only API.
        public let dimensions: [Dimension]?
        /// Internal only API.
        public let metricName: String
        /// Internal only API.
        public let statisticValues: StatisticSet?
        /// Internal only API.
        public let timestamp: Date
        public let unit: Unit?
        /// Internal only API.
        public let value: Double?

        public init(dimensions: [Dimension]? = nil, metricName: String, statisticValues: StatisticSet? = nil, timestamp: Date, unit: Unit? = nil, value: Double? = nil) {
            self.dimensions = dimensions
            self.metricName = metricName
            self.statisticValues = statisticValues
            self.timestamp = timestamp
            self.unit = unit
            self.value = value
        }

        private enum CodingKeys: String, CodingKey {
            case dimensions = "Dimensions"
            case metricName = "MetricName"
            case statisticValues = "StatisticValues"
            case timestamp = "Timestamp"
            case unit = "Unit"
            case value = "Value"
        }
    }

    public struct ModuleLoggingConfiguration: AWSDecodableShape {
        /// Provides the ARN for the CloudWatch group where the logs will be published.
        public let cloudWatchLogGroupArn: String?
        /// Defines that the logging module is enabled.
        public let enabled: Bool?
        /// Defines the log level, which can be CRITICAL, ERROR, WARNING, or INFO.
        public let logLevel: LoggingLevel?

        public init(cloudWatchLogGroupArn: String? = nil, enabled: Bool? = nil, logLevel: LoggingLevel? = nil) {
            self.cloudWatchLogGroupArn = cloudWatchLogGroupArn
            self.enabled = enabled
            self.logLevel = logLevel
        }

        private enum CodingKeys: String, CodingKey {
            case cloudWatchLogGroupArn = "CloudWatchLogGroupArn"
            case enabled = "Enabled"
            case logLevel = "LogLevel"
        }
    }

    public struct ModuleLoggingConfigurationInput: AWSEncodableShape {
        /// Defines that the logging module is enabled.
        public let enabled: Bool
        /// Defines the log level, which can be CRITICAL, ERROR, WARNING, or INFO.
        public let logLevel: LoggingLevel

        public init(enabled: Bool, logLevel: LoggingLevel) {
            self.enabled = enabled
            self.logLevel = logLevel
        }

        private enum CodingKeys: String, CodingKey {
            case enabled = "Enabled"
            case logLevel = "LogLevel"
        }
    }

    public struct NetworkConfiguration: AWSEncodableShape & AWSDecodableShape {
        /// A JSON list of 1 or more security groups IDs by name, in the same VPC as the subnets.
        public let securityGroupIds: [String]?
        /// Provide a JSON list of 2 subnet IDs by name. These must be private subnets, in the same VPC, in two different availability zones.
        public let subnetIds: [String]?

        public init(securityGroupIds: [String]? = nil, subnetIds: [String]? = nil) {
            self.securityGroupIds = securityGroupIds
            self.subnetIds = subnetIds
        }

        public func validate(name: String) throws {
            try self.securityGroupIds?.forEach {
                try validate($0, name: "securityGroupIds[]", parent: name, max: 1024)
                try validate($0, name: "securityGroupIds[]", parent: name, min: 1)
                try validate($0, name: "securityGroupIds[]", parent: name, pattern: "^sg-[a-zA-Z0-9\\-._]+$")
            }
            try self.validate(self.securityGroupIds, name: "securityGroupIds", parent: name, max: 5)
            try self.validate(self.securityGroupIds, name: "securityGroupIds", parent: name, min: 1)
            try self.subnetIds?.forEach {
                try validate($0, name: "subnetIds[]", parent: name, max: 1024)
                try validate($0, name: "subnetIds[]", parent: name, min: 1)
                try validate($0, name: "subnetIds[]", parent: name, pattern: "^subnet-[a-zA-Z0-9\\-._]+$")
            }
            try self.validate(self.subnetIds, name: "subnetIds", parent: name, max: 2)
            try self.validate(self.subnetIds, name: "subnetIds", parent: name, min: 2)
        }

        private enum CodingKeys: String, CodingKey {
            case securityGroupIds = "SecurityGroupIds"
            case subnetIds = "SubnetIds"
        }
    }

    public struct PublishMetricsInput: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "environmentName", location: .uri(locationName: "EnvironmentName"))
        ]

        /// Publishes environment metric data to Amazon CloudWatch.
        public let environmentName: String
        /// Publishes metric data points to Amazon CloudWatch. CloudWatch associates the data points with the specified metrica.
        public let metricData: [MetricDatum]

        public init(environmentName: String, metricData: [MetricDatum]) {
            self.environmentName = environmentName
            self.metricData = metricData
        }

        public func validate(name: String) throws {
            try self.validate(self.environmentName, name: "environmentName", parent: name, max: 80)
            try self.validate(self.environmentName, name: "environmentName", parent: name, min: 1)
            try self.validate(self.environmentName, name: "environmentName", parent: name, pattern: "^[a-zA-Z][0-9a-zA-Z-_]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case metricData = "MetricData"
        }
    }

    public struct PublishMetricsOutput: AWSDecodableShape {
        public init() {}
    }

    public struct StatisticSet: AWSEncodableShape {
        /// Internal only API.
        public let maximum: Double?
        /// Internal only API.
        public let minimum: Double?
        /// Internal only API.
        public let sampleCount: Int?
        /// Internal only API.
        public let sum: Double?

        public init(maximum: Double? = nil, minimum: Double? = nil, sampleCount: Int? = nil, sum: Double? = nil) {
            self.maximum = maximum
            self.minimum = minimum
            self.sampleCount = sampleCount
            self.sum = sum
        }

        private enum CodingKeys: String, CodingKey {
            case maximum = "Maximum"
            case minimum = "Minimum"
            case sampleCount = "SampleCount"
            case sum = "Sum"
        }
    }

    public struct TagResourceInput: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "resourceArn", location: .uri(locationName: "ResourceArn"))
        ]

        /// The tag resource ARN of the MWAA environments.
        public let resourceArn: String
        /// The tag resource tag of the MWAA environments.
        public let tags: [String: String]

        public init(resourceArn: String, tags: [String: String]) {
            self.resourceArn = resourceArn
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, max: 1224)
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, min: 1)
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, pattern: "^arn:aws(-[a-z]+)?:airflow:[a-z0-9\\-]+:\\d{12}:environment/\\w+")
            try self.tags.forEach {
                try validate($0.key, name: "tags.key", parent: name, max: 128)
                try validate($0.key, name: "tags.key", parent: name, min: 1)
                try validate($0.key, name: "tags.key", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, max: 256)
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, min: 1)
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case tags = "Tags"
        }
    }

    public struct TagResourceOutput: AWSDecodableShape {
        public init() {}
    }

    public struct UntagResourceInput: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "resourceArn", location: .uri(locationName: "ResourceArn")),
            AWSMemberEncoding(label: "tagKeys", location: .querystring(locationName: "tagKeys"))
        ]

        /// The tag resource ARN of the MWAA environments.
        public let resourceArn: String
        /// The tag resource key of the MWAA environments.
        public let tagKeys: [String]

        public init(resourceArn: String, tagKeys: [String]) {
            self.resourceArn = resourceArn
            self.tagKeys = tagKeys
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, max: 1224)
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, min: 1)
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, pattern: "^arn:aws(-[a-z]+)?:airflow:[a-z0-9\\-]+:\\d{12}:environment/\\w+")
            try self.tagKeys.forEach {
                try validate($0, name: "tagKeys[]", parent: name, max: 128)
                try validate($0, name: "tagKeys[]", parent: name, min: 1)
                try validate($0, name: "tagKeys[]", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
            }
            try self.validate(self.tagKeys, name: "tagKeys", parent: name, max: 50)
            try self.validate(self.tagKeys, name: "tagKeys", parent: name, min: 0)
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct UntagResourceOutput: AWSDecodableShape {
        public init() {}
    }

    public struct UpdateEnvironmentInput: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "name", location: .uri(locationName: "Name"))
        ]

        /// The Airflow Configuration Options to update of your Amazon MWAA environment.
        public let airflowConfigurationOptions: [String: String]?
        /// The Airflow Version to update of your Amazon MWAA environment.
        public let airflowVersion: String?
        /// The Dags folder S3 Path to update of your Amazon MWAA environment.
        public let dagS3Path: String?
        /// The Environment Class to update of your Amazon MWAA environment.
        public let environmentClass: String?
        /// The Executio Role ARN to update of your Amazon MWAA environment.
        public let executionRoleArn: String?
        /// The Logging Configuration to update of your Amazon MWAA environment.
        public let loggingConfiguration: LoggingConfigurationInput?
        /// The Maximum Workers to update of your Amazon MWAA environment.
        public let maxWorkers: Int?
        /// The name of your Amazon MWAA environment that you wish to update.
        public let name: String
        /// The Network Configuration to update of your Amazon MWAA environment.
        public let networkConfiguration: UpdateNetworkConfigurationInput?
        /// The Plugins.zip S3 Object Version to update of your Amazon MWAA environment.
        public let pluginsS3ObjectVersion: String?
        /// The Plugins.zip S3 Path to update of your Amazon MWAA environment.
        public let pluginsS3Path: String?
        /// The Requirements.txt S3 ObjectV ersion to update of your Amazon MWAA environment.
        public let requirementsS3ObjectVersion: String?
        /// The Requirements.txt S3 Path to update of your Amazon MWAA environment.
        public let requirementsS3Path: String?
        /// The S3 Source Bucket ARN to update of your Amazon MWAA environment.
        public let sourceBucketArn: String?
        /// The Webserver Access Mode to update of your Amazon MWAA environment.
        public let webserverAccessMode: WebserverAccessMode?
        /// The Weekly Maintenance Window Start to update of your Amazon MWAA environment.
        public let weeklyMaintenanceWindowStart: String?

        public init(airflowConfigurationOptions: [String: String]? = nil, airflowVersion: String? = nil, dagS3Path: String? = nil, environmentClass: String? = nil, executionRoleArn: String? = nil, loggingConfiguration: LoggingConfigurationInput? = nil, maxWorkers: Int? = nil, name: String, networkConfiguration: UpdateNetworkConfigurationInput? = nil, pluginsS3ObjectVersion: String? = nil, pluginsS3Path: String? = nil, requirementsS3ObjectVersion: String? = nil, requirementsS3Path: String? = nil, sourceBucketArn: String? = nil, webserverAccessMode: WebserverAccessMode? = nil, weeklyMaintenanceWindowStart: String? = nil) {
            self.airflowConfigurationOptions = airflowConfigurationOptions
            self.airflowVersion = airflowVersion
            self.dagS3Path = dagS3Path
            self.environmentClass = environmentClass
            self.executionRoleArn = executionRoleArn
            self.loggingConfiguration = loggingConfiguration
            self.maxWorkers = maxWorkers
            self.name = name
            self.networkConfiguration = networkConfiguration
            self.pluginsS3ObjectVersion = pluginsS3ObjectVersion
            self.pluginsS3Path = pluginsS3Path
            self.requirementsS3ObjectVersion = requirementsS3ObjectVersion
            self.requirementsS3Path = requirementsS3Path
            self.sourceBucketArn = sourceBucketArn
            self.webserverAccessMode = webserverAccessMode
            self.weeklyMaintenanceWindowStart = weeklyMaintenanceWindowStart
        }

        public func validate(name: String) throws {
            try self.airflowConfigurationOptions?.forEach {
                try validate($0.key, name: "airflowConfigurationOptions.key", parent: name, max: 64)
                try validate($0.key, name: "airflowConfigurationOptions.key", parent: name, min: 1)
                try validate($0.key, name: "airflowConfigurationOptions.key", parent: name, pattern: "^[a-z]+([a-z._]*[a-z]+)?$")
                try validate($0.value, name: "airflowConfigurationOptions[\"\($0.key)\"]", parent: name, max: 256)
                try validate($0.value, name: "airflowConfigurationOptions[\"\($0.key)\"]", parent: name, min: 1)
                try validate($0.value, name: "airflowConfigurationOptions[\"\($0.key)\"]", parent: name, pattern: ".*")
            }
            try self.validate(self.airflowVersion, name: "airflowVersion", parent: name, max: 32)
            try self.validate(self.airflowVersion, name: "airflowVersion", parent: name, min: 1)
            try self.validate(self.airflowVersion, name: "airflowVersion", parent: name, pattern: "^[0-9a-z.]+$")
            try self.validate(self.dagS3Path, name: "dagS3Path", parent: name, max: 1024)
            try self.validate(self.dagS3Path, name: "dagS3Path", parent: name, min: 1)
            try self.validate(self.dagS3Path, name: "dagS3Path", parent: name, pattern: ".*")
            try self.validate(self.environmentClass, name: "environmentClass", parent: name, max: 1024)
            try self.validate(self.environmentClass, name: "environmentClass", parent: name, min: 1)
            try self.validate(self.executionRoleArn, name: "executionRoleArn", parent: name, max: 1224)
            try self.validate(self.executionRoleArn, name: "executionRoleArn", parent: name, min: 1)
            try self.validate(self.executionRoleArn, name: "executionRoleArn", parent: name, pattern: "^arn:aws(-[a-z]+)?:iam::\\d{12}:role/?[a-zA-Z_0-9+=,.@\\-_/]+$")
            try self.validate(self.maxWorkers, name: "maxWorkers", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, max: 80)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z][0-9a-zA-Z-_]*$")
            try self.networkConfiguration?.validate(name: "\(name).networkConfiguration")
            try self.validate(self.pluginsS3ObjectVersion, name: "pluginsS3ObjectVersion", parent: name, max: 1024)
            try self.validate(self.pluginsS3ObjectVersion, name: "pluginsS3ObjectVersion", parent: name, min: 1)
            try self.validate(self.pluginsS3Path, name: "pluginsS3Path", parent: name, max: 1024)
            try self.validate(self.pluginsS3Path, name: "pluginsS3Path", parent: name, min: 1)
            try self.validate(self.pluginsS3Path, name: "pluginsS3Path", parent: name, pattern: ".*")
            try self.validate(self.requirementsS3ObjectVersion, name: "requirementsS3ObjectVersion", parent: name, max: 1024)
            try self.validate(self.requirementsS3ObjectVersion, name: "requirementsS3ObjectVersion", parent: name, min: 1)
            try self.validate(self.requirementsS3Path, name: "requirementsS3Path", parent: name, max: 1024)
            try self.validate(self.requirementsS3Path, name: "requirementsS3Path", parent: name, min: 1)
            try self.validate(self.requirementsS3Path, name: "requirementsS3Path", parent: name, pattern: ".*")
            try self.validate(self.sourceBucketArn, name: "sourceBucketArn", parent: name, max: 1224)
            try self.validate(self.sourceBucketArn, name: "sourceBucketArn", parent: name, min: 1)
            try self.validate(self.sourceBucketArn, name: "sourceBucketArn", parent: name, pattern: "^arn:aws(-[a-z]+)?:s3:::airflow-[a-z0-9.\\-]+$")
            try self.validate(self.weeklyMaintenanceWindowStart, name: "weeklyMaintenanceWindowStart", parent: name, max: 9)
            try self.validate(self.weeklyMaintenanceWindowStart, name: "weeklyMaintenanceWindowStart", parent: name, min: 1)
            try self.validate(self.weeklyMaintenanceWindowStart, name: "weeklyMaintenanceWindowStart", parent: name, pattern: "(MON|TUE|WED|THU|FRI|SAT|SUN):([01]\\d|2[0-3]):(00|30)")
        }

        private enum CodingKeys: String, CodingKey {
            case airflowConfigurationOptions = "AirflowConfigurationOptions"
            case airflowVersion = "AirflowVersion"
            case dagS3Path = "DagS3Path"
            case environmentClass = "EnvironmentClass"
            case executionRoleArn = "ExecutionRoleArn"
            case loggingConfiguration = "LoggingConfiguration"
            case maxWorkers = "MaxWorkers"
            case networkConfiguration = "NetworkConfiguration"
            case pluginsS3ObjectVersion = "PluginsS3ObjectVersion"
            case pluginsS3Path = "PluginsS3Path"
            case requirementsS3ObjectVersion = "RequirementsS3ObjectVersion"
            case requirementsS3Path = "RequirementsS3Path"
            case sourceBucketArn = "SourceBucketArn"
            case webserverAccessMode = "WebserverAccessMode"
            case weeklyMaintenanceWindowStart = "WeeklyMaintenanceWindowStart"
        }
    }

    public struct UpdateEnvironmentOutput: AWSDecodableShape {
        /// The ARN to update of your Amazon MWAA environment.
        public let arn: String?

        public init(arn: String? = nil) {
            self.arn = arn
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "Arn"
        }
    }

    public struct UpdateError: AWSDecodableShape {
        /// Error code of update.
        public let errorCode: String?
        /// Error message of update.
        public let errorMessage: String?

        public init(errorCode: String? = nil, errorMessage: String? = nil) {
            self.errorCode = errorCode
            self.errorMessage = errorMessage
        }

        private enum CodingKeys: String, CodingKey {
            case errorCode = "ErrorCode"
            case errorMessage = "ErrorMessage"
        }
    }

    public struct UpdateNetworkConfigurationInput: AWSEncodableShape {
        /// Provide a JSON list of 1 or more security groups IDs by name, in the same VPC as the subnets.
        public let securityGroupIds: [String]

        public init(securityGroupIds: [String]) {
            self.securityGroupIds = securityGroupIds
        }

        public func validate(name: String) throws {
            try self.securityGroupIds.forEach {
                try validate($0, name: "securityGroupIds[]", parent: name, max: 1024)
                try validate($0, name: "securityGroupIds[]", parent: name, min: 1)
                try validate($0, name: "securityGroupIds[]", parent: name, pattern: "^sg-[a-zA-Z0-9\\-._]+$")
            }
            try self.validate(self.securityGroupIds, name: "securityGroupIds", parent: name, max: 5)
            try self.validate(self.securityGroupIds, name: "securityGroupIds", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case securityGroupIds = "SecurityGroupIds"
        }
    }
}
